#ifndef BIB_PLANIFICADORES_H_
#define BIB_PLANIFICADORES_H_

#include <stdlib.h>
#include <semaphore.h>

#include "bib_Log.h"
#include "bib_Socket.h"
#include "bib_Hilos.h"
#include "bib_Comunicacion.h"
#include "bib_Cache.h"

#define DESTINO_FS 0
#define TAM_SECTOR 512

typedef struct stPLANIFICADOR{
	struct stSOLICITUD *solicitudPend;
	struct stSOLICITUD *solicitudPendEspejar;
	struct stSOLICITUD *solicitudEnv;
	uint8_t idPlanificador;
	uint32_t bloquesEspejados;
	int sockPlanif;
	pthread_t hilo;
	sem_t accesoPlanif;
	char CHSCorrecto;
	char terminarHilo;
	sem_t hiloFinalizado;
	struct stPLANIFICADOR *sgte;
} stPLANIFICADOR;

typedef struct stSOLICITUD{
	struct HEADER_NIPC header;
	struct PAYLOAD_LECTURA *lectura;
	struct PAYLOAD_ESCRITURA *escritura;
	uint8_t destino;
	int socketFS;
	char informarEjecucion;
	struct stSOLICITUD *sgte;
} stSOLICITUD;

typedef struct EST_CHS{	/*Todos tienen un valor minimo de cero para definir una posicion y un valor minimo de uno para definir el tamanio del disco*/
	uint16_t	cilindro;
	uint16_t	cabezal;
	uint16_t	sector;
} EST_CHS;

typedef struct PAYLOAD_LECTURA{
	uint32_t	id;
	uint32_t	sector;
} PAYLOAD_LECTURA;

typedef struct PAYLOAD_ESCRITURA{
	uint32_t	id;
	uint32_t	sector;
	char		buffer[TAM_SECTOR];
} PAYLOAD_ESCRITURA;

typedef struct PAYLOAD_RESPUESTA_LECTURA{
	uint32_t	id;
	char		buffer[TAM_SECTOR];
} PAYLOAD_RESPUESTA_LECTURA;


int obtenerCantidadPlanif();
int distribuirSolicitud(struct HEADER_NIPC header, char *payload, int destino, int sock);
int agregarPlanificador(int sock, uint8_t idPlanif);
int quitarSolicitudLista(struct stPLANIFICADOR *estructuraPlanif, long idSolicitud, uint8_t type);
int existeIdPlanif(uint8_t idPlanif);
int determinarCHS(int sock);
void inicializarCantEsc(int sock, int valor);
int compararCHS(int sock,struct EST_CHS respCHS);
void liberarPlanificador(struct stPLANIFICADOR *punteroPlanif);
uint32_t cantSectoresPlanif(struct EST_CHS chs);
uint32_t generarIdSolicitud();
int quitarSolicitudListaPlanif(uint8_t *destino, int *sockFS, int sockPlanif, uint32_t idSolicitud, uint32_t *sectorEspejar, char *informarEscritura);
int encolarEscrituraEspejo(struct PAYLOAD_RESPUESTA_LECTURA *contenido, uint8_t idPlanif, uint32_t sector);
int calcularValorEspejado(int sockPlanif);
int calcularValorEspejadoPunt(struct stPLANIFICADOR *planif);
int planificadorEspejado(struct stPLANIFICADOR *planif);
struct stPLANIFICADOR *obtenerPuntPlanif(int sock);
uint32_t obtenerValorEspejados(struct stPLANIFICADOR *planif);

#endif
